package navalgo3.Modelo;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Collections;



 public abstract class Superficie {
	protected ArrayList partes;
	
	public Superficie(ArrayList<Posicion> posicionInicialNave) {
		}
	
	public void recibeImpacto(Disparo unDisparo){
		Posicion posicionDeImpacto = unDisparo.getPosicion();
		this.buscarParte(posicionDeImpacto).recibirImpacto();
	}
	
	public void recibeImpacto(Fragmento unFragmento) {
		Posicion posicionDeImpacto = unFragmento.getPosicion();
		this.buscarParte(posicionDeImpacto).recibirImpacto();
	}
	
	public boolean estaDaniadaEn(Posicion posicionDeImpacto) {
		return this.buscarParte(posicionDeImpacto).estaDaniada();
	}

	protected ParteDeNave buscarParte(Posicion posicion){
		Iterator<ParteDeNave> iterador = this.partes.iterator();
		boolean encontrada = false;
		ParteDeNave parteActual = new ParteDeNave(new Posicion(0,0));
		while(iterador.hasNext() && !encontrada){
			parteActual = iterador.next();
			encontrada = (parteActual.estaUbicadaEn(posicion));
		}
		if (encontrada) {
			return parteActual;
		} else {
			return null;
		}
	}
	
	public boolean coincideConOtraSuperficie(ArrayList<Posicion> posicionDeLaNaveAlMoverse){
		Iterator<ParteDeNave> iterador1 = this.partes.iterator();
		Iterator<Posicion> iterador2 = posicionDeLaNaveAlMoverse.iterator();
		ParteDeNave parteActual = new ParteDeNave(new Posicion(0,0));
		Posicion posicionActual = new Posicion (0,0);
		boolean coinciden = false;
		while(iterador1.hasNext() && iterador2.hasNext()){
			parteActual = iterador1.next();
			posicionActual = iterador2.next();
			coinciden = (parteActual.estaUbicadaEn(posicionActual));
		}
		return coinciden;
	}
	
	public void moverPartes(Rumbo rumbo){
		Iterator<ParteDeNave> iterador = this.partes.iterator();
		ParteDeNave parteActual = new ParteDeNave(new Posicion(0,0));
		while(iterador.hasNext()){
			parteActual = iterador.next();
			parteActual.cambiarPosicionDeParte(rumbo);
		}
	}
	
	public boolean estaEnElBordeSuperior(){
		boolean estaEnElBorde = false;
		if (((ParteDeNave) this.partes.get(this.partes.size()-1)).tocaBordeSuperior() || ((ParteDeNave) this.partes.get(1)).tocaBordeSuperior()){
			estaEnElBorde = true;
		}
		return estaEnElBorde;
	}
	
	public boolean estaEnElBordeInferior(){
		boolean estaEnElBorde = false;
		if (((ParteDeNave) this.partes.get(this.partes.size()-1)).tocaBordeInferior() || ((ParteDeNave) this.partes.get(1)).tocaBordeInferior()){
			estaEnElBorde = true;
		}
		return estaEnElBorde;
	}
	
	public boolean estaEnElBordeIzquierdo(){
		boolean estaEnElBorde = false;
		if (((ParteDeNave) this.partes.get(this.partes.size()-1)).tocaBordeIzquierdo() || ((ParteDeNave) this.partes.get(1)).tocaBordeIzquierdo()){
			estaEnElBorde = true;
		}
		return estaEnElBorde;
	}
	
	public boolean estaEnElBordeDerecho(){
		boolean estaEnElBorde = false;
		if (((ParteDeNave) this.partes.get(this.partes.size()-1)).tocaBordeDerecho() || ((ParteDeNave) this.partes.get(1)).tocaBordeDerecho()){
			estaEnElBorde = true;
		}
		return estaEnElBorde;
	}
	
	public void invertirPartes(){
		Collections.reverse(this.partes);
	}

	public boolean estaDestruida() {
		int partesDestruidas = 0;
		Iterator<ParteDeNave> iterador = this.partes.iterator();
		while(iterador.hasNext()){
			if(iterador.next().estaDestruida()){
				partesDestruidas++;
			}
		}
		return partesDestruidas == this.partes.size();
	}

	public void recibeImpactoMina(Fragmento fragmento) {
		
		
	}

	public boolean existeParteEn(Posicion posicion) {
		return this.buscarParte(posicion) != null;
	}

	public int devolverNumeroDeParteDeNave(Posicion posicionActual) {
		Iterator<ParteDeNave> iterador = this.partes.iterator();
		boolean encontrada = false;
		int numeroDeParte = 0;
		ParteDeNave parteActual = new ParteDeNave(new Posicion(0,0));
		while(iterador.hasNext() && !encontrada){
			parteActual = iterador.next();
			encontrada = (parteActual.estaUbicadaEn(posicionActual));
			numeroDeParte ++;
		}
		return numeroDeParte;
	}

	public boolean estaVertical() {
		return (((ParteDeNave) (this.partes.get(1))).dameColumna() == ((ParteDeNave) (this.partes.get(2))).dameColumna());
	}

}